#ifndef TABLAHASHA_H
#define TABLAHASHA_H

#include "Tabla.h"
#include "TablaHash.h"
#include "NodoTablaHashAbierto.h"
#include "Puntero.h"

template <class C, class V>
class TablaHashA: public Tabla<C,V>
{
public:

	
	TablaHashA(const Puntero<Comparador<C>> comparador, Puntero<FuncionHash<C>> funcionHash, int largo);
	TablaHashA(Iterador<Tupla<C,V>> iterador, const Puntero<Comparador<C>> comparador, Puntero<FuncionHash<C>> funcionHash, int largo);

	bool Agregar(const C& c, const V& v);
	/* retorna true SII encuentra un elemento con la clave a borrar */
	bool Borrar(const C& c);
	void BorrarTodos();

	Puntero<Tabla<C,V>> Clonar() const;

	/* PREDICADOS */
	bool EstaVacia() const;
	bool EstaLlena() const;
	bool Pertenece(const C& c) const;

	/* SELECTORAS */
	const V& Obtener(const C& c) const;
	bool IntentarObtener(const C& c, V& v) const;
	nat Largo() const;
	 
	Iterador<C> Claves() const;
	Iterador<V> Valores() const;

	Iterador<Tupla<C,V>> ObtenerIterador() const;

	 
private:
	Puntero<TablaHash<C,V>>  tabla;
};

#include "TablaHashA.cpp"

#endif